package br.com.dlm.simuladoitil.fragments;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

import br.com.dlm.simuladoitil.R;
import br.com.dlm.simuladoitil.basicas.Categoria;
import br.com.dlm.simuladoitil.basicas.Questao;

public class QuestaoFragment extends GeralFragment {

    public static final String PARAMETRO_CATEGORIA = "PARAMETRO_CATEGORIA";
    public static final String PARAMETRO_POSICAO = "PARAMETRO_POSICAO";

    private Categoria categoria;
    private List<Questao> questoes;
    private Questao questaoVisualizada;
    private int indexQuestaoVisualizada;

    private int quantidadeDeAcertos, quantidadeDeRespondidas, quantidadeDeQuestoesASerRespondidas, alternativaSelecionada;

    // VIEWS
    private View view;
    private TextView textViewPerguntaCompleta;
    private RadioGroup radioGroupAlternativas;
    private RadioButton radioButtonAlternativaUm;
    private RadioButton radioButtonAlternativaDois;
    private RadioButton radioButtonAlternativaTres;
    private RadioButton radioButtonAlternativaQuatro;
    private Button buttonProximaQuestao;

    private View.OnClickListener cliqueDoBotao = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        alternativaSelecionada = radioGroupAlternativas.getCheckedRadioButtonId();
        RadioButton resposta = (RadioButton) view.findViewById(alternativaSelecionada);

        if (alternativaSelecionada == -1) {
            Toast.makeText(getActivity(), getString(R.string.excecao_selecione_alternativa), Toast.LENGTH_LONG).show();
        } else {
            if (conteudo().consultarAlternativaPorId(questaoVisualizada.idAlternativaCorreta).texto.equals(resposta.getText().toString())) {
                quantidadeDeAcertos++;
            }

            quantidadeDeRespondidas++;

            if (quantidadeDeRespondidas == quantidadeDeQuestoesASerRespondidas) {
                atualizarQuestoesRespondidas();
                exibirMensagemResultado();
            } else {
                carregarProximaQuestao();
            }
        }
        }
    };

    public static QuestaoFragment newInstance(Categoria categoria, int posicao){
        Bundle parametros =  new Bundle();

        parametros.putSerializable(PARAMETRO_CATEGORIA, categoria);
        parametros.putInt(PARAMETRO_POSICAO, posicao);

        QuestaoFragment questaoFragment = new QuestaoFragment();
        questaoFragment.setArguments(parametros);
        questaoFragment.setRetainInstance(true);

        return questaoFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        categoria = (Categoria) getArguments().getSerializable(PARAMETRO_CATEGORIA);
        indexQuestaoVisualizada = getArguments().getInt(PARAMETRO_POSICAO);
        questoes = categoria.questoes;
        questaoVisualizada = categoria.questoes.get(indexQuestaoVisualizada);

        quantidadeDeQuestoesASerRespondidas = questoes.size();
        quantidadeDeAcertos = 0;
        quantidadeDeRespondidas = 0;
        alternativaSelecionada = -1;

        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_questao, container, false);

        textViewPerguntaCompleta = (TextView) view.findViewById(R.id.textViewPerguntaCompleta);

        radioButtonAlternativaUm = (RadioButton) view.findViewById(R.id.radioButtonAlternativaUm);
        radioButtonAlternativaDois = (RadioButton) view.findViewById(R.id.radioButtonAlternativaDois);
        radioButtonAlternativaTres = (RadioButton) view.findViewById(R.id.radioButtonAlternativaTres);
        radioButtonAlternativaQuatro = (RadioButton) view.findViewById(R.id.radioButtonAlternativaQuatro);

        radioGroupAlternativas = (RadioGroup) view.findViewById(R.id.radioGroupAlternativas);

        buttonProximaQuestao = (Button) view.findViewById(R.id.buttonProximaQuestao);
        buttonProximaQuestao.setOnClickListener(cliqueDoBotao);

        carregarInformacoesNaTela(questaoVisualizada, indexQuestaoVisualizada);

        return view;
    }

    private void carregarProximaQuestao() {
        indexQuestaoVisualizada++;
        if (indexQuestaoVisualizada + 1 > quantidadeDeQuestoesASerRespondidas) {
            indexQuestaoVisualizada = 0;
        }
        questaoVisualizada = questoes.get(indexQuestaoVisualizada);

        carregarInformacoesNaTela(questaoVisualizada, indexQuestaoVisualizada);
    }

    private void atualizarQuestoesRespondidas() {
        int quantidadeDeQuestoes = questoes.size();
        for (int indexQuestao = 0; indexQuestao < quantidadeDeQuestoes; indexQuestao++) {
            Questao questao = questoes.get(indexQuestao);
            questao.respondida = true;
            conteudo().alterarQuestao(questao, null);
        }
    }

    public void carregarInformacoesNaTela(Questao questaoVisualizada, int indexQuestaoVisualizada){
        getActivity().setTitle(getString(R.string.numero_questao, (indexQuestaoVisualizada + 1), quantidadeDeQuestoesASerRespondidas));

        textViewPerguntaCompleta.setText(questaoVisualizada.pergunta);

        radioGroupAlternativas.clearCheck();
        radioButtonAlternativaUm.setText(questaoVisualizada.alternativas.get(0).texto);
        radioButtonAlternativaDois.setText(questaoVisualizada.alternativas.get(1).texto);
        radioButtonAlternativaTres.setText(questaoVisualizada.alternativas.get(2).texto);
        radioButtonAlternativaQuatro.setText(questaoVisualizada.alternativas.get(3).texto);

        this.indexQuestaoVisualizada = indexQuestaoVisualizada;
        this.questaoVisualizada = questaoVisualizada;
    }

    private void exibirMensagemResultado() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setTitle(getString(R.string.fim_rodada));
        builder.setMessage(getString(R.string.mensagem_quantidade_acertos, String.valueOf(quantidadeDeAcertos)));

        builder.setPositiveButton(getString(R.string.sair), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                getActivity().setResult(Activity.RESULT_OK);
                getActivity().finish();
            }
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }
}